package es.ucm.fdi.pe.practica2.genetico2.mutacion;

import java.util.ArrayList;

import es.ucm.fdi.pe.practica2.genetico2.Alumno;
import es.ucm.fdi.pe.practica2.genetico2.CromosomaAlumnos;

public class MutacionHeuristica {
	
	public void mutar(CromosomaAlumnos c1){
		int [] v =new int[3];
		int[] indexes;
		
		CromosomaAlumnos mejorCopia = new CromosomaAlumnos(c1);
		mejorCopia.setFitness(0.5); //OJO CON ESTO DEBERIA HACERSE EN EL CONSTRUCTOR POR COPIA
		//System.out.println("Fitness mejor "+mejorCopia.getFitness()+" "+mejorCopia.getN());
		Permutaciones p = new Permutaciones(3);
		
		double mejorValor=c1.getFitness();
		
		v[0]=c1.getGruposAlumnos().indexOf(c1.getGruposAlumnos().get((int) (Math.random()*c1.getN())));
	
		do{
			v[1]=c1.getGruposAlumnos().indexOf(c1.getGruposAlumnos().get((int) (Math.random()*c1.getN())));
			//System.out.println("Me quedo aqui "+v[0].getIdentificador()+" "+v[1].getIdentificador());
		}while(v[1]==v[0]);
		
		do{
			v[2]=c1.getGruposAlumnos().indexOf(c1.getGruposAlumnos().get((int) (Math.random()*c1.getN())));
		}while(v[2]==v[0]||v[2]==v[1]);
		
		/*System.out.println(v[0]+","+v[1]+","+v[2]);
		System.out.println("Tengo los elementos:");
		System.out.println(c1.getGruposAlumnos().get(v[0]).toString());
		System.out.println(c1.getGruposAlumnos().get(v[1]).toString());
		System.out.println(c1.getGruposAlumnos().get(v[2]).toString());
		System.out.println(c1.getGruposAlumnos().indexOf(c1.getGruposAlumnos().get(v[0])));
		System.out.println(c1.getGruposAlumnos().indexOf(c1.getGruposAlumnos().get(v[1])));
		System.out.println(c1.getGruposAlumnos().indexOf(c1.getGruposAlumnos().get(v[2])));
		*/
		while (p.hasMore()) {
			indexes = p.getNext();
			CromosomaAlumnos copiaAlumnos = new CromosomaAlumnos(c1);
			//System.out.println(indexes[0]+","+indexes[1]+","+indexes[2]);
			
			for (int i = 0; i < indexes.length; i++) {
				copiaAlumnos.getGruposAlumnos().set(v[i],c1.getGruposAlumnos().get(v[indexes[i]]));
			}
			//System.out.println(copiaAlumnos.toString());
			copiaAlumnos.setFitness(0.5);
			if(copiaAlumnos.getFitness()<mejorValor){	
				mejorCopia = new CromosomaAlumnos(copiaAlumnos);
				mejorCopia.setFitness(0.5);
				mejorValor = copiaAlumnos.getFitness();
				//System.out.println("Mejor valor: "+copiaAlumnos.getFitness());
			}
		}
		
		c1.setGruposAlumnos(mejorCopia.getGruposAlumnos());
		
		//System.out.println("Mejor valor final: "+mejorCopia.getFitness());
		//System.out.println(c1.toString());
	}
	
	public static void main(String args[]) throws Exception{
		Alumno a1 = new Alumno(101, 8.75); //Alumno normal 1
		a1.addExcluido(102);
		a1.addExcluido(103);
		a1.addExcluido(104);
	//	System.out.println(a1.toString());
		
		Alumno a2 = new Alumno(201, 5.75); //Alumno normal 2
		a2.addExcluido(202);
		a2.addExcluido(203);
		a2.addExcluido(204);
	//	System.out.println(a2.toString());
		
		Alumno a3 = new Alumno(301, 9.75); //Alumno normal 3
		a3.addExcluido(302);
		a3.addExcluido(303);
		a3.addExcluido(304);
	//	System.out.println(a3.toString());
		
		Alumno a4 = new Alumno(401, 6.75); //Alumno normal 4
		a4.addExcluido(402);
		a4.addExcluido(403);
		a4.addExcluido(404);
	//	System.out.println(a4.toString());
		
		Alumno a5 = new Alumno(501, 2.75); //Alumno normal 5
		a5.addExcluido(502);
		a5.addExcluido(101);
		a5.addExcluido(301);
	//	System.out.println(a5.toString());
		
	Alumno a6 = new Alumno(601, 3.75); //Alumno normal 6
		a6.addExcluido(602);
		a6.addExcluido(603);
		a6.addExcluido(604);
	//	System.out.println(a6.toString());
		
		ArrayList<Alumno> lista= new ArrayList<Alumno>();
		lista.add(a1);
		lista.add(a2);
		lista.add(a3);
		lista.add(a4);
		lista.add(a5);
		lista.add(a6);
		
		CromosomaAlumnos c1= new CromosomaAlumnos(3, lista);
		c1.setFitness(0.5);
		System.out.println("c1N"+c1.getM());
		CromosomaAlumnos c2 = new CromosomaAlumnos(c1);
		c2.setFitness(0.5);
		System.out.println("mejorValorprimero "+c1.getFitness()+" "+c2.getFitness());
		System.out.println(c1.toString());
		MutacionHeuristica m = new MutacionHeuristica();
		m.mutar(c1);
		
		/*for (int i=0;i<4;i++){
			System.out.println("Vuelta "+(i+1)+"---------");
			CromosomaAlumnos c1= new CromosomaAlumnos(3, lista);
			System.out.println(c1.toString());
			MutacionHeuristica m = new MutacionHeuristica();
			m.mutar(c1);
			System.out.println(c1.toString());
			System.out.println("----------");
		}*/
	}	

}
